<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // 浅拷贝：针对于引用类型的数据进行赋值的一种操作概念，只针对于数组或者对象的第一层数据进行赋值操作
        // 1.循环赋值
        var arr=[1,2,3,4,["a","b","c"]];
        var user={
            name:"tom",
            age:20,
            skills:["打游戏","rap","吹牛"]
        };

        // a.循环浅拷贝
        //循环浅拷贝数组
        function copy(obj){
            let arrs=[];
            for(let i in obj){
                arrs[i]=obj[i];//arrs[0]=arr[0]  arrs[4]=arr[4] arrs[4]和arr[4]指向同一个地址
            }
            return arrs;
        }
        // var arrays=copy(arr);
        // arrays[4][0]="嘻嘻";
        // console.log(arrays);
        // console.log(arr);

        // 循环浅拷贝对象
        function copy2(obj){
            let objs={};
            for(let i in obj){
                objs[i]=obj[i];//objs["name"]="tom"  objs["age"]=20   objs["skills"]=user["skills"]
            }
            return objs;
        }
        // var user2=copy2(user);
        // user2.skills[0]="睡觉";
        // user2.name="cici";
        // console.log(user2);
        // console.log(user);

        // b.解构赋值的浅拷贝
        // let [...newArr]=arr;
        // newArr[4][0]="呵呵呵";
        // console.log(newArr);
        // console.log(arr);

        // let {...users}=user;
        // users.skills[0]="打篮球";
        // console.log(users);
        // console.log(user);

        // c.展开运算符的浅拷贝
        // let arrs3=[...arr];
        // arrs3[4][0]="哈哈";
        // console.log(arrs3);
        // console.log(arr);

        // let user2={...user};
        // user2.skills[0]="打羽毛球";
        // console.log(user2);
        // console.log(user);

        //深拷贝：针对引用类型数据进行赋值的一种操作概念，只针对于数组或者对象的每一层数据进行赋值操作
        // a.JSON工具包(JSON工具包内置方法本身自带的深度拷贝循环操作)
        let newArr=[1,2,3,4,["a","b","c"]];
        let str=JSON.stringify(newArr);
        console.log(str);
        let newArr2=JSON.parse(str);
        newArr2[4][0]="杨幂";
        console.log(newArr2);
        console.log(newArr);

        // b.递归拷贝
        // 递归：一个函数在执行时，函数调用了函数本身，递归函数中必须存在一个明确逻辑判断的

        let users={
            id:1,
            name:"黄晓明",
            address:{
                city:"南京"
            }
        };
        function deepCopy(obj1,obj2){
            for(let key in obj2){
                if((typeof obj2[key])=="object"){//判断对象的属性值是否为对象
                    obj1[key]={};
                    deepCopy(obj1[key],obj2[key]);//递归
                }else{
                    obj1[key]=obj2[key];
                }   
               
            }
            
        }

        let objs={};
        deepCopy(objs,users);
        objs.address.city="北京";
        console.log(objs);
        console.log(users);


    </script>
</head>
<body>
    
</body>
</html>